package com.mou.boot.service;

import com.mou.boot.entity.User;
import com.mou.boot.exception.ResourceNotFoundException;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Created by mou on 2018/5/8.
 *
 * @author Mou
 * @date 2018/5/8
 * @since 1.0
 */
@Service
public class UserService {

    /**
     * 模拟数据库操作 --- 本地存储好了
     */
    private final Map<Long, User> data = new ConcurrentHashMap<>();

    /**
     * 获取所有的用户对象.
     *
     * @return flux
     */
    public Flux<User> getList() {
        return Flux.fromIterable(this.data.values());
    }

    /**
     * 通过指定的ID获取对应的用户列表对象.
     *
     * @param ids 用户IDs
     * @return flux
     */
    public Flux<User> getById(final Flux<Long> ids) {
        return ids.flatMap(id -> Mono.justOrEmpty(this.data.get(id)));
    }

    /**
     * 根据指定Id获取对应的对象
     *
     * @param id 用户的Id
     * @return mono
     */
    public Mono<User> getById(final Long id) {
        return Mono.justOrEmpty(this.data.get(id)).switchIfEmpty(Mono.error(new ResourceNotFoundException()));
    }

    /**
     * 新增或者新增用户的对象
     *
     * @param users 用户列表
     * @return flux
     */
    public Flux<User> saveOrupdate(final Flux<User> users) {
        return users.doOnNext(user -> this.data.put(user.getId(), user));
    }

    /**
     * 新增或者更新用户的对象
     *
     * @param user 用户
     * @return mono
     */
    public Mono<User> saveOrupdate(final User user) {
        this.data.put(user.getId(), user);
        return Mono.just(user);
    }

    /**
     * 删除指定的对象
     *
     * @param id 用户的ID
     * @return mono
     */
    public Mono<User> delete(final Long id) {
        return Mono.justOrEmpty(this.data.remove(id));
    }
}
